" 将<leader>设置成空格
let mapleader = " "

" 将光标所在行放在屏幕中间
nnoremap ff zz

" 设置每隔1秒自动保存文件
let autosave = 1

" 设置在文件之间跳转时，自动保存文件
set autowriteall
  
" 保存配置后立马生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC

" 打开文件时，光标移动到上次关闭文件时光标所在的位置
autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line("$") |
    \   exe "normal! g`\"" |
    \ endif

"设置光标在不同模式下的形状
if empty($TMUX)
  let &t_SI = "\<Esc>]50;CursorShape=1\x7"
  let &t_EI = "\<Esc>]50;CursorShape=0\x7"
  let &t_SR = "\<Esc>]50;CursorShape=2\x7"
else
  let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
  let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
  let &t_SR = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=2\x7\<Esc>\\"
endif


" 用<++>作为占位符，通过快捷键进行跳转
inoremap <silent><M-k> <Esc>0/<<CR>4x:nohlsearch<CR>a


"设置vim在工作时不需要兼容vi
" 一般是关闭兼容性开关
set nocompatible


" 设置交换文件写入磁盘的时间默认值(4000ms)
set updatetime=300


" 打开行号和相对行号的开关
 set number
 set relativenumber

" 设置光标线
set cursorline

" vim打开文件时，自动进行文件类型检测
 filetype on

" 根据文件的类型，自动进行缩进
 filetype indent on

" 自动加载对应文件类型的.vim插件
" 对应的.vim插件中会包括对应文件
" 类型的注释格式，智能补全函数等
 filetype plugin on

" filetype plugin indent on
" 相当于上面三个命令的简写体

" 将语法检测打开
 syntax on

" 设置鼠标在vim中是可用的
 set mouse=a

" 当一行写不下时，自动在下一行进行显示，但不是换行
 set nowrap

" 在光标上下滚动时，屏幕上下都会留有7行代码
set scrolloff=7


" 搜索高亮
 set hlsearch

" 开启实时搜索
 set incsearch

" 消除每次启动vim时高亮上一次搜索的结果
 exec "nohlsearch"

" 取消高亮
 map <leader><CR> :nohlsearch<CR>

"在高亮的字符串中移动，并将光标放在屏幕中间
 nnoremap = nzz
 nnoremap - Nzz

 noremap \ =
  
" 设置在搜索时，忽略大小写
 set ignorecase
" 搜索时智能判断是否忽略大小写
 set smartcase

" set cursorline

" 在状态栏右下角显示输入的命令
 set showcmd

" 在命令行模式下输入命令
" 按tab键可以给予提示
set wildmenu

" 设置tab缩进的大小
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2

" 设置自动缩进
set autoindent
set smartindent


" 控制上下左右
noremap i k
noremap k j
noremap j h
noremap m i
noremap M I
noremap U 5k
noremap H 5j

" 加载vim的配置文件
 map R :source $MYVIMRC<CR>

map ; :

" 分屏操作
map sl :set splitright<CR>:vsplit<CR>
map sj :set nosplitright<CR>:vsplit<CR>
map si :set nosplitbelow<CR>:split<CR>
map sk :set splitbelow<CR>:split<CR>

" 分屏之间的切换
map <LEADER>i <C-w>k
map <LEADER>k <C-w>j
map <LEADER>j <C-w>h
map <LEADER>l <C-w>l

" 控制分屏的大小
map <up> :res +5<CR>
map <down> :res -5<CR>
map <left> :vertical resize -5<CR>
map <right> :vertical resize +5<CR>

" 水平与垂直分屏之间的切换
map sv <C-w>t<C-w>H
map sh <C-w>t<C-w>K

" 颜色主题
colorscheme snazzy


"======
"====== filetype map
"======

" Tex File
autocmd FileType json,markdown,tex let g:indentLine_conceallevel=0


" 插件相关的配置
call plug#begin('~/AppData/Local/nvim/plugged/')

Plug 'vim-airline/vim-airline'

Plug 'connorholyday/vim-snazzy'

Plug 'preservim/nerdtree'

Plug 'junegunn/vim-easy-align'

Plug 'preservim/tagbar'

Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}

Plug 'dhruvasagar/vim-table-mode'

Plug 'neoclide/coc.nvim', {'branch': 'release'}

Plug 'kevinoid/vim-jsonc'

Plug 'mhinz/vim-startify'

Plug 'Yggdroot/LeaderF', {'do': ':LeaderfInstallCExtension'}

Plug 'honza/vim-snippets'

Plug 'Yggdroot/indentLine'

Plug 'mg979/vim-visual-multi', {'branch': 'master'}

Plug 'preservim/nerdcommenter'

Plug 'godlygeek/tabular'

Plug 'plasticboy/vim-markdown'

Plug 'lervag/vimtex'

Plug 'donRaphaco/neotex', {'for': 'tex'}

call plug#end()



" ======
" ====== NERDTree相关的配置  
" ======

" 切换NerdTree
nnoremap tt :NERDTreeToggle<CR>

" 将NERDTree默认的i键改成n键
let g:NERDTreeMapOpenSplit = get(g:, 'NERDTreeMapOpenSplit', 'n')

" 指定文件打开vim时，不打开NERDTree
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists('s:std_in') && v:this_session == '' | NERDTree | endif

" 更改默认的箭头
let g:NERDTreeDirArrowExpandable = '▸'
let g:NERDTreeDirArrowCollapsible = '▾'



"======
"====== markdown-preview.nvim相关的配置
"======

" 设置markdown在浏览器中显示的样式
" let g:mkdp_markdown_css = expand('~/AppData/Local/nvim/plugged/markdown-preview.nvim/vue/vue.css')

" 设置markdown-preview.nvim的映射
nnoremap tp :MarkdownPreviewToggle<CR>



" ======
" ====== easy-align插件相关的配置
" ======

" 设置easy-align插件的映射
nmap ga :EasyAlign<CR>*=
xmap ga :EasyAlign<CR>*=



"======
"====== coc.nvim
"======

" coc.nvim服务启动之后，自动安装列表中没有安装的插件
let g:coc_global_extensions = ['coc-snippets']


" 使用<tab>键和<S-tab>键在代码提示页中移动
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"

" 使用<CR>确定代码提示
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" 打开代码提示窗口
inoremap <silent><expr> <C-l> coc#refresh()

" - 将代码片段展开
" - 跳转到下一个占位符中
imap jj <Plug>(coc-snippets-expand-jump)


"======
"====== vim-table-mode
"======

" 进入tableMode
"nnoremap tm :TableModeToggle<CR>

" 使用与markdown语法的table
let g:table_mode_corner='|'


"======
"====== nerdcommenter
"======

" 注释符号与代码之间添加一个空格
let g:NERDSpaceDelims = 1


"======
"====== indentLine
"======

" 当文件类型是json或者markdown时，设置conceallevel为0
" autocmd FileType json,markdown let g:indentLine_conceallevel=0



"======
"====== vim-json
"======

" 当文件类型是json或者markdown时，设置conceallevel为0
autocmd FileType json,markdwon let g:vim_json_syntax_conceal=0


"======
"====== Leaderf
"======

" 将Leaderf在浮动窗口中显示，同时在浮动窗口查看结果
let g:Lf_WindowPosition = 'popup'
let g:Lf_PreviewInPopup = 1


" 设置搜索文件的快捷键
let g:Lf_ShortcutF = '<leader>'



"======
"====== vim-markdown
"======

" 禁用折叠
let g:vim_markdown_folding_disabled = 1

" 打开Latex语法
let g:vim_markdown_math = 1


"======
"====== vimtex
"======


" 设置Tex的语法风格:latex
let g:tex_flavor = 'latex'

" 设置编译的时候不出现弹窗
let g:vimtex_quickfix_mode=0

" 设置默认的pdf阅读器
let g:vimtex_view_general_viwer = 'SumatraPDF'
let g:vimtex_view_general_options
      \ = '-reuse-instance -forward-search @tex @line @pdf'
let g:vimtex_viw_general_options_latexmk = '-reuse-instance'


" 使用xelatex作为默认的编译器，用以支持中文
let g:vimtex_compiler_latexmk_engines={'_': '-xelatex'}
let g:vimtex_compiler_latexrun_engines={'_': '-xelatex'}



"======
"====== neotex
"======

let g:neotex_enabled=2
let g:neotex_delay=400
let g:neotex_pdflatex_alternative='xelatex'
